package com.todomvc.fw;

import java.util.ArrayList;
import java.util.List;

public class Todos {

	private List<Todo> storedTodos = null;
	
	public Todos(List<Todo> todos) {
		this.storedTodos = new ArrayList<Todo>(todos);
	}

	
	public int size() {
		return storedTodos.size();
	}


	public Todos withAdded(Todo todo) {
		Todos newList = new Todos(storedTodos);
		newList.storedTodos.add(todo);
		return newList;
	}

	
	public Todos withoutFirst() {
		Todos newList = new Todos(storedTodos);
		if (newList.storedTodos.size() > 0) {
			newList.storedTodos.remove(0);
		}	
		return newList;
	}

	
	public Todos withoutLast() {
		Todos newList = new Todos(storedTodos);
		if (newList.storedTodos.size() > 0) {
			newList.storedTodos.remove(newList.storedTodos.size() - 1);
		}	
		return newList;
	}

	
	public Todos withoutNts(int index) {
		Todos newList = new Todos(storedTodos);
		if (newList.storedTodos.size() > 0 && (index > 0) && (index <= newList.storedTodos.size())) {
			newList.storedTodos.remove(index - 1);
		}	
		return newList;
	}

	
	public Todos withFirstToggled() {
		Todos newList = new Todos(storedTodos);
			Todo todo = newList.storedTodos.get(0);
			todo.toggleCompleted();
		return newList;
	}

	
	public Todos withLastToggled () {
		Todos newList = new Todos(storedTodos);
			Todo todo = newList.storedTodos.get(newList.storedTodos.size() - 1);
			todo.toggleCompleted();
		return newList;
	}

	
	public Todos withNtsToggled (int index) {
		Todos newList = new Todos(storedTodos);
		if (newList.storedTodos.size() > 0 && (index > 0) && (index <= newList.storedTodos.size())) {
			Todo todo = newList.storedTodos.get(index - 1);
			todo.toggleCompleted();
		}	
		return newList;
	}

	
	@Override
	public int hashCode() {
		final int prime = 31;
		int result = 1;
		result = prime * result
				+ ((storedTodos == null) ? 0 : storedTodos.hashCode());
		return result;
	}

	@Override
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Todos other = (Todos) obj;
		if (storedTodos == null) {
			if (other.storedTodos != null)
				return false;
		} else if (!storedTodos.equals(other.storedTodos))
			return false;
		return true;
	}

	@Override
	public String toString() {
		return "Todos [" + storedTodos + "]";
	}

}
